package modelo.dao;

/*
 * Maneja entidades:
 *   - Cliente
 *   - Sucursal
 */

import java.sql.*;
import java.util.*;

import modelo.*;

public class DAOClientes {
	protected HashMap<String, Cliente> clientes = new HashMap<String, Cliente>();
	protected HashMap<Integer, Sucursal> sucursales = new HashMap<Integer, Sucursal>();
	
	public void cargarClientes() {
		ResultSet rs = Servidor.consultar(
			"SELECT *\n" +
			"FROM cliente\n"
			);
		
		try {
			while (rs.next()) {
				Cliente e = new Cliente(
						rs.getString("cod_cliente"),
						rs.getString("nombre"),
						rs.getString("direccion"),
						Servidor.estados().consultarCiudadPorCodigo(rs.getInt("cod_ciudad")),
						rs.getString("telefono"),
						Status.valueOf(rs.getInt("status")));
				clientes.put(e.clave(), e);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public Cliente agregarCliente(String codigo, String nombre, String direccion, Ciudad ciudad, String telefono, Status status) {
		boolean b = Servidor.ejecutar(
			"INSERT INTO cliente\n" +
			"    (cod_cliente, nombre, direccion, cod_ciudad, telefono, status)\n" +
			"VALUES\n" +
			"    ('" + codigo + "', '" + nombre + "', '" + direccion + "', " + ciudad.getCodigo() + ", '" + telefono + "', " + status.toInt() + ")\n"
			);
		
		if (!b) return null;
		
		Cliente e = new Cliente(codigo, nombre, direccion, ciudad, telefono, status);
		clientes.put(e.clave(), e);
		
		return e;
	}
	
	public Cliente consultarClientePorCodigo(String cod) {
		return clientes.get(cod);
	}
	
	public Cliente modificarCliente(Cliente cliente) {
		boolean b = Servidor.ejecutar(
			"UPDATE cliente\n" +
			"SET nombre = '" + cliente.getNombre() + "',\n" +
			"    direccion = '" + cliente.getDireccion() + "',\n" +
			"    cod_ciudad = " + cliente.getCiudad().getCodigo() + ",\n" +
			"    telefono = '" + cliente.getTelefono() + "',\n" +
			"    status = " + cliente.getStatus().toInt() + "\n" +
			"WHERE cod_cliente = '" + cliente.getCodigo() + "'\n"
			);
		
		if (!b) return null;
		
		return cliente;
	}
	
	public ArrayList<Cliente> consultarClientes() {
		ResultSet rs = Servidor.consultar(
			"SELECT *\n" +
			"FROM cliente\n"
			);
		
		return adjuntarCliente(rs);
	}
	
	public ArrayList<Cliente> consultarClientesPorStatus(Status status) {
		ResultSet rs = Servidor.consultar(
			"SELECT *\n" +
			"FROM cliente\n" +
			"WHERE status = " + status.toInt() + "\n"
			);
		
		return adjuntarCliente(rs);
	}
	
	private ArrayList<Cliente> adjuntarCliente(ResultSet rs) {
		ArrayList<Cliente> lst = new ArrayList<Cliente>();
		
		try {
			while (rs.next())
				lst.add(clientes.get(rs.getString("cod_cliente")));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return lst;
	}
	
	public void cargarSucursales() {
		ResultSet rs = Servidor.consultar(
			"SELECT *\n" +
			"FROM sucursal\n"
			);
		
		try {
			while (rs.next()) {
				Sucursal e = new Sucursal(
						rs.getInt("cod_sucursal"),
						consultarClientePorCodigo(rs.getString("cod_cliente")),
						rs.getString("descripcion"),
						rs.getString("direccion"),
						Servidor.estados().consultarCiudadPorCodigo(rs.getInt("cod_ciudad")),
						rs.getString("telefono"),
						rs.getString("comentarios"),
						Status.valueOf(rs.getInt("status")));
				sucursales.put(e.clave(), e);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public Sucursal agregarSucursal(Cliente cliente, String descripcion, String direccion, Ciudad ciudad, String telefono, String comentarios, Status status) {
		try {
			ResultSet rs = Servidor.consultar(
				"INSERT INTO sucursal\n" +
				"    (descripcion, telefono, direccion, comentarios, cod_ciudad, cod_cliente, status)\n" +
				"VALUES\n" +
				"    ('" + descripcion + "', '" + telefono + "', '" + direccion + "', '" + comentarios + "', " + ciudad.getCodigo() + ", '" + cliente.getCodigo() + "', " + status.toInt() + ")\n" +
				"RETURNING cod_sucursal"
				);
				
			if (!rs.next()) return null;
				
			Sucursal e = new Sucursal(rs.getInt("cod_sucursal"), cliente, descripcion, direccion, ciudad, telefono, comentarios, status);
			sucursales.put(e.clave(), e);
			
			return e;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public Sucursal consultarSucursalPorCodigo(int cod) {
		return sucursales.get(cod);
	}
	
	public Sucursal modificarSucursal(Sucursal sucursal) {
		boolean b = Servidor.ejecutar(
			"UPDATE sucursal\n" +
			"SET descripcion = '" + sucursal.getDescripcion() + "',\n" +
			"    telefono = '" + sucursal.getTelefono() + "',\n" +
			"    direccion = '" + sucursal.getDireccion() + "',\n" +
			"    cod_ciudad = " + sucursal.getCiudad().getCodigo() + ",\n" +
			"    cod_cliente = '" + sucursal.getCliente().getCodigo() + "',\n" +
			"    comentarios = '" + sucursal.getComentarios() + "',\n" +
			"    status = " + sucursal.getStatus().toInt() + "\n" +
			"WHERE cod_sucursal = " + sucursal.getCodigo() + "\n"
			);
		
		if (!b) return null;
		
		return sucursal;
	}
	
	public ArrayList<Sucursal> consultarSucursales() {
		ResultSet rs = Servidor.consultar(
			"SELECT *\n" +
			"FROM sucursal\n"
			);
		
		return adjuntarSucursal(rs);
	}
	
	public ArrayList<Sucursal> consultarSucursalesPorCliente(String codigoCliente) {
		ResultSet rs = Servidor.consultar(
			"SELECT cod_sucursal\n" +
			"FROM sucursal\n" +
			"WHERE cod_cliente = '" + codigoCliente + "'\n"
			);
		
		return adjuntarSucursal(rs);
	}
	
	
	public ArrayList<Sucursal> consultarSucursalesPorClienteYStatus(String codigoCliente, Status status) {
		ResultSet rs = Servidor.consultar(
			"SELECT cod_sucursal\n" +
			"FROM sucursal\n" +
			"WHERE cod_cliente = '" + codigoCliente + "'\n" +
			"AND status = " + status.toInt() + "\n"
			);
		
		return adjuntarSucursal(rs);
	}

	private ArrayList<Sucursal> adjuntarSucursal(ResultSet rs) {
		ArrayList<Sucursal> lst = new ArrayList<Sucursal>();
		
		try {
			while (rs.next())
				lst.add(sucursales.get(rs.getInt("cod_sucursal")));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return lst;
	}
}
